• R generation

https://rss.onlinelibrary.wiley.com/doi/10.1111/j.1740-9713.2018.01169.x

2 R zor şeyler için kolay, kolay şeyler için zor

R Syntax Comparison::CHEAT SHEET

https://www.amelia.mn/Syntax-cheatsheet.pdf


3 R paketleri

3.1 Neden paketler var



https://blog.mitchelloharawild.com/blog/user-2018-feature-wall/



3.2 Paketleri nereden bulabiliriz

3.3 Kendi paket evrenini oluştur


3.4 R için yardım bulma

  • Vignette


https://stackoverflow.com/

  • Google uygun anahtar kelime



http://cran.r-project.org/doc/contrib/Baggott-refcard-v2.pdf

https://www.rstudio.com/resources/cheatsheets/

  • Awesome R

https://github.com/qinwf/awesome-R#readme

https://awesome-r.com/

  • Twitter

https://twitter.com/hashtag/rstats?src=hash

  • Reproducible Examples

3.5 R paket yükleme

install.packages("tidyverse", dependencies = TRUE)
install.packages("jmv", dependencies = TRUE)
install.packages("questionr", dependencies = TRUE)
install.packages("Rcmdr", dependencies = TRUE)
install.packages("summarytools")

5 RStudio ile veri yükleme

https://support.rstudio.com/hc/en-us/articles/218611977-Importing-Data-with-RStudio


5.1 Excel

5.2 SPSS

5.3 csv


6 Veriyi görüntüleme

View(data)
data
head
tail
glimpse
str
skimr::skim()

7 Veriyi değiştirme

7.1 Veriyi kod ile değiştirelim

7.2 Veriyi eklentilerle değiştirme


7.3 RStudio aracılığıyla recode

questionr paketi kullanılacak


https://juba.github.io/questionr/articles/recoding_addins.html




8 Basit tanımlayıcı istatistikler

summary()
mean
median
min
max
sd
table()

8.1 summarytools

https://cran.r-project.org/web/packages/summarytools/vignettes/Introduction.html








8.2 skimr

library(skimr)
skim(df)

8.3 DataExplorer

library(DataExplorer)
DataExplorer::create_report(df)


8.4 Grafikler



descr(tobacco, style = 'rmarkdown')

print(descr(tobacco), method = 'render', table.classes = 'st-small')

dfSummary(tobacco, style = 'grid', plain.ascii = FALSE)

print(dfSummary(tobacco, graph.magnif = 0.75), method = 'render')



9 Rcmdr

library(Rcmdr)

Rcmdr::Commander()
  • A Comparative Review of the R Commander GUI for R

http://r4stats.com/articles/software-reviews/r-commander/


11 Sonraki Konular

  • RStudio ile GitHub
  • Hipotez testleri
  • R Markdown ve R Notebook ile tekrarlanabilir rapor

12 Diğer kodlar


13 Geri Bildirim




  1. Bu bir derlemedir, mümkün mertebe alıntılara referans vermeye çalıştım.

LS0tCnRpdGxlOiBSIGlsZSBhbmFsaXplIGJhxZ9sYXJrZW5eW0J1IGJpciBkZXJsZW1lZGlyLCBtw7xta8O8biBtZXJ0ZWJlIGFsxLFudMSxbGFyYSByZWZlcmFucwogIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiRGVybGV5ZW4gW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgcm1kZm9ybWF0czo6aHRtbF9jbGVhbjoKICAgIGhpZ2hsaWdodDoga2F0ZQogIGh0bWxfbm90ZWJvb2s6CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBoaWdobGlnaHQ6IGthdGUKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICc1JwogIGh0bWxfZG9jdW1lbnQ6IAogICAgZmlnX2NhcHRpb246IHllcwogICAga2VlcF9tZDogeWVzCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCgoKYGBge3Iga25pdHJfaW5pdCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmxpYnJhcnkocm1kZm9ybWF0cykKCiMjIEdsb2JhbCBvcHRpb25zCm9wdGlvbnMobWF4LnByaW50PSI3NSIpCm9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwKICAgICAgICAgICAgICAgcHJvbXB0PUZBTFNFLAogICAgICAgICAgICAgICB0aWR5PVRSVUUsCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsCiAgICAgICAgICAgICAgIHdhcm5pbmc9RkFMU0UpCm9wdHNfa25pdCRzZXQod2lkdGg9NzUpCmBgYAoKCgo8IS0tIE9wZW4gYWxsIGxpbmtzIGluIG5ldyB0YWItLT4gIAo8YmFzZSB0YXJnZXQ9Il9ibGFuayIvPiAgIAoKCjwhLS0gR28gdG8gd3d3LmFkZHRoaXMuY29tL2Rhc2hib2FyZCB0byBjdXN0b21pemUgeW91ciB0b29scyAtLT4gPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLy9zNy5hZGR0aGlzLmNvbS9qcy8zMDAvYWRkdGhpc193aWRnZXQuanMjcHViaWQ9cmEtNWJjMzY5MDBhNDA1MDkwYiI+ICAKPC9zY3JpcHQ+IAoKCgoKWyFbXShodHRwOi8vcmVzLmNsb3VkaW5hcnkuY29tL2R5ZDkxMWttaC9pbWFnZS91cGxvYWQvZl9hdXRvLHFfYXV0bzpiZXN0L3YxNTMwMTEzMDc3L0ltYWdlXzJfdmZ5NDhiLnBuZyldKGh0dHBzOi8vd3d3LmRhdGFjYW1wLmNvbS9jb21tdW5pdHkvdHV0b3JpYWxzL2RhdGEtc2NpZW5jZS1waXRmYWxscykKCgotIFIgZ2VuZXJhdGlvbgoKaHR0cHM6Ly9yc3Mub25saW5lbGlicmFyeS53aWxleS5jb20vZG9pLzEwLjExMTEvai4xNzQwLTk3MTMuMjAxOC4wMTE2OS54CgoKIyBSIHnDvGtsZW1lCgpodHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WGNCTEVWa25xdlkKClshW1doYXQgaXMgUj9dKGh0dHA6Ly9pbWcueW91dHViZS5jb20vdmkvWGNCTEVWa25xdlkvMC5qcGcpXShodHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WGNCTEVWa25xdlkpCgoKIyMgUi1wcm9qZWN0CgpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy8KCi0tLQoKWyFbXShodHRwczovL2lzbWF5Yy5naXRodWIuaW8vdGFsa3MvbmVzcy1pbmZlci9pbWcvZW5naW5lLnBuZyldKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL3NsaWRlX2RlY2suaHRtbCM2KQoKLS0tCgojIyBSU3R1ZGlvCgpodHRwczovL3d3dy5yc3R1ZGlvLmNvbS8KCmh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvCgpodHRwczovL21vZGVybmRpdmUuY29tLzItZ2V0dGluZy1zdGFydGVkLmh0bWwKCi0tLQoKWyFbXShodHRwOi8vd3d3LXVzZXJzLnlvcmsuYWMudWsvfmVyMTMvUlN0dWRpbyUyMEFuYXRvbXkuc3ZnKV0oaHR0cHM6Ly9idXp6cmJlZWxpbmUuYmxvZy8yMDE4LzA3LzA0L3JzdHVkaW8tYW5hdG9teS8pCgoKCi0tLQoKIyMjIFJTdHVkaW8gZWtsZW50aWxlcmkKCi0gRGlzY292ZXIgYW5kIGluc3RhbGwgdXNlZnVsIFJTdHVkaW8gYWRkaW5zCgpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvYWRkaW5zbGlzdC9SRUFETUUuaHRtbAoKaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9yc3R1ZGlvYWRkaW5zLwoKCmBgYHtyfQojIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigicnN0dWRpby9hZGRpbmV4YW1wbGVzIiwgdHlwZSA9ICJzb3VyY2UiKQpgYGAKCgotLS0KCiMjIFgxMQoKaHR0cHM6Ly93d3cueHF1YXJ0ei5vcmcvCgotLS0KCiMjIEphdmEgT1MKCmh0dHBzOi8vc3VwcG9ydC5hcHBsZS5jb20va2IvZGwxNTcyCgotLS0KCgojIFIgem9yIMWfZXlsZXIgacOnaW4ga29sYXksIGtvbGF5IMWfZXlsZXIgacOnaW4gem9yCgoKLSBbUiBtYWtlcyBlYXN5IHRoaW5ncyBoYXJkLCBhbmQgaGFyZCB0aGluZ3MgZWFzeV0oaHR0cDovL3I0c3RhdHMuY29tL2FydGljbGVzL3doeS1yLWlzLWhhcmQtdG8tbGVhcm4vKQoKCi0gQXluxLEgxZ9leWkgw6dvayBmYXpsYSDFn2VraWxkZSB5YXBtYWsgbcO8bWvDvG4KClIgU3ludGF4IENvbXBhcmlzb246OkNIRUFUIFNIRUVUCgpodHRwczovL3d3dy5hbWVsaWEubW4vU3ludGF4LWNoZWF0c2hlZXQucGRmCgoKCi0tLQoKCiMgUiBwYWtldGxlcmkKCgojIyBOZWRlbiBwYWtldGxlciB2YXIKClshW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2FwcHN0b3JlLnBuZyldKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL3NsaWRlX2RlY2suaHRtbCM3KQoKLS0tCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SSBsb3ZlIHRoZSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiBjb21tdW5pdHkuPGJyPlNvbWVvbmUgaXMgbGlrZSwgJnF1b3Q7b2ggaGV5IHBlZXBzLCBJIHNhdyBhIGJpZyBuZWVkIGZvciB0aGlzIG11bmRhbmUgYnV0IGRpZmZpY3VsdCB0YXNrIHRoYXQgSSBpbmZyZXF1ZW50bHkgZG8sIHNvIEkgY3JlYXRlZCBhIHBhY2thZ2UgdGhhdCB3aWxsIGxpdGVyYWxseSBzY3JhcGUgdGhlIGxhc3QgYml0cyBvZiBwZWFudXQgYnV0dGVyIG91dCBvZiB0aGUgamFyIGZvciB5b3UuIEl0JiMzOTtzIGNhbGxlZCBwYnBseXIuJnF1b3Q7PGJyPldoYXQgYSB0cmliZS48L3A+Jm1kYXNoOyBGcmFuayBFbGF2c2t5IOG0sOG1g+G1l+G1gyDhtYLhtqbhtrvhtYPKs+G1iCAoQEZyYW5rbHlfRGF0YSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9GcmFua2x5X0RhdGEvc3RhdHVzLzEwMTQxODkwOTUyOTQyOTE5Njg/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSAzLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCi0tLQoKCgpodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvdXNlci0yMDE4LWZlYXR1cmUtd2FsbC8KCi0tLQoKIVtdKGh0dHBzOi8vYmxvZy5taXRjaGVsbG9oYXJhd2lsZC5jb20vYmxvZy8yMDE4LTA3LTExLXVzZXItMjAxOC1mZWF0dXJlLXdhbGxfZmlsZXMvZmluYWwuanBnKQoKLS0tCgojIyBQYWtldGxlcmkgbmVyZWRlbiBidWxhYmlsaXJpegoKLSBBdmFpbGFibGUgQ1JBTiBQYWNrYWdlcyBCeSBOYW1lICAKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2F2YWlsYWJsZV9wYWNrYWdlc19ieV9uYW1lLmh0bWwKCi0gQmlvY29uZHVjdG9yICAKaHR0cHM6Ly93d3cuYmlvY29uZHVjdG9yLm9yZwoKLSBSZWNvbW1lbmRSICAKaHR0cDovL3JlY29tbWVuZHIuaW5mby8KCi0gcGtnc2VhcmNoICAKQ1JBTiBwYWNrYWdlIHNlYXJjaCAgCmh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhY3Jhbi9wa2dzZWFyY2gKCi0gQXdlc29tZSBSICAKaHR0cHM6Ly9hd2Vzb21lLXIuY29tLyAgCgoKIyMgS2VuZGkgcGFrZXQgZXZyZW5pbmkgb2x1xZ90dXIKCi0gcGtndmVyc2U6IEJ1aWxkIGEgTWV0YS1QYWNrYWdlIFVuaXZlcnNlICAKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3BrZ3ZlcnNlL2luZGV4Lmh0bWwKCgoKLS0tCgojIyBSIGnDp2luIHlhcmTEsW0gYnVsbWEKCgpgYGB7ciB5YXJkxLFtfQojID9tZWFuCiMgPz9lZmV0Y2gKIyBoZWxwKG1lcmdlKQojIGV4YW1wbGUobWVyZ2UpCmBgYAoKCgotIFZpZ25ldHRlCgohW10oZmlndXJlcy92aWduZXR0ZS5wbmcpCgotLS0KCi0gUkRvY3VtZW50YXRpb24KaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnCgotIFIgUGFja2FnZSBEb2N1bWVudGF0aW9uCmh0dHBzOi8vcmRyci5pby8KCi0gR2l0SHViCgotIFN0YWNrb3ZlcmZsb3cKCmh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vCgotIEdvb2dsZSB1eWd1biBhbmFodGFyIGtlbGltZQoKCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SG93IEkgdXNlIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+IDxicj5oL3QgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9UaGVQcmFjdGljYWxEZXY/cmVmX3NyYz10d3NyYyU1RXRmdyI+QFRoZVByYWN0aWNhbERldjwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90LmNvL2VyUm5URzBVanIiPnBpYy50d2l0dGVyLmNvbS9lclJuVEcwVWpyPC9hPjwvcD4mbWRhc2g7IEVtaWx5IEJvdmVlIChAZWJvdmVlMDkpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vZWJvdmVlMDkvc3RhdHVzLzEwMjgwMzc1OTQ5NDc0ODU2OTY/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXVndXN0IDEwLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCgotLS0KCgohW10oZmlndXJlcy9Hb29nbGUtcGFja2FnZS1uYW1lLnBuZykKCi0tLQoKCgohW10oZmlndXJlcy9Hb29nbGUtc3RhcnQtd2l0aC1SLnBuZykKCi0tLQoKLSBBd2Vzb21lIENoZWF0c2hlZXQKaHR0cHM6Ly9naXRodWIuY29tL2RldGFpbHlhbmcvYXdlc29tZS1jaGVhdHNoZWV0CgpodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnL2RvYy9jb250cmliL0JhZ2dvdHQtcmVmY2FyZC12Mi5wZGYKCmh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Jlc291cmNlcy9jaGVhdHNoZWV0cy8KCgotIEF3ZXNvbWUgUgoKaHR0cHM6Ly9naXRodWIuY29tL3FpbndmL2F3ZXNvbWUtUiNyZWFkbWUKCmh0dHBzOi8vYXdlc29tZS1yLmNvbS8KCgoKCi0gVHdpdHRlcgoKaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaAoKCi0gUmVwcm9kdWNpYmxlIEV4YW1wbGVzCgo8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5Hb3QgYSBxdWVzdGlvbiB0byBhc2sgb24gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9TbGFja0hRP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkBTbGFja0hRPC9hPiBvciBwb3N0IG9uIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vZ2l0aHViP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkBnaXRodWI8L2E+PyBObyB0aW1lIHRvIHJlYWQgdGhlIGxvbmcgcG9zdCBvbiBob3cgdG8gdXNlIHJlcHJleD8gSGVyZSBpcyBhIDIwLXNlY29uZCBnaWYgZm9yIHlvdSB0byBmb3JtYXQgeW91ciBSIGNvZGVzIG5pY2VseSBhbmQgZm9yIG90aGVycyB0byByZXByb2R1Y2UgeW91ciBwcm9ibGVtLiAoQW4gZXhhbXBsZSBmcm9tIGEgdGFsayBnaXZlbiBieSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL0plbm55QnJ5YW4/cmVmX3NyYz10d3NyYyU1RXRmdyI+QEplbm55QnJ5YW48L2E+KSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXQ/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90LmNvL2dwdUdYcEZJc1giPnBpYy50d2l0dGVyLmNvbS9ncHVHWHBGSXNYPC9hPjwvcD4mbWRhc2g7IFpoaVlhbmcgKEB6aGlpaXlhbmcpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vemhpaWl5YW5nL3N0YXR1cy8xMDUzMDA2MDAzNzExNTY5OTIwP3JlZl9zcmM9dHdzcmMlNUV0ZnciPk9jdG9iZXIgMTgsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCgoKCgotLS0KCiMjIFIgcGFrZXQgecO8a2xlbWUKCmBgYAppbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJqbXYiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJxdWVzdGlvbnIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJSY21kciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoInN1bW1hcnl0b29scyIpCmBgYAoKYGBge3IgcGFrZXQgecO8a2xlbWV9CiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJqbXYiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoInF1ZXN0aW9uciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygiUmNtZHIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoInN1bW1hcnl0b29scyIpCmBgYAoKCmBgYHtyIHBha2V0IGNhZ2lybWEsIGVycm9yPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXZhbCA9IFRSVUUsIGluY2x1ZGUgPSBUUlVFfQojIHJlcXVpcmUodGlkeXZlcnNlKQojIHJlcXVpcmUoam12KQojIHJlcXVpcmUocXVlc3Rpb25yKQojIGxpYnJhcnkoc3VtbWFyeXRvb2xzKQojIGxpYnJhcnkoZ2dhbmltYXRlKQpgYGAKCi0tLQoKIyBSIHN0dWRpbyBpbGUgcHJvamUgb2x1xZ90dXJtYQoKaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVzLzIwMDUyNjIwNy1Vc2luZy1Qcm9qZWN0cwoKIVtdKGh0dHA6Ly93d3cucnN0dWRpby5jb20vaW1hZ2VzL2RvY3MvcHJvamVjdHNfbmV3LnBuZykKCi0tLQoKIyBSU3R1ZGlvIGlsZSB2ZXJpIHnDvGtsZW1lCgpodHRwczovL3N1cHBvcnQucnN0dWRpby5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjE4NjExOTc3LUltcG9ydGluZy1EYXRhLXdpdGgtUlN0dWRpbwoKIVtdKGh0dHBzOi8vc3VwcG9ydC5yc3R1ZGlvLmNvbS9oYy9lbi11cy9hcnRpY2xlX2F0dGFjaG1lbnRzLzIwNjI3NzYxOC9kYXRhLWltcG9ydC1vdmVydmlldy5naWYpCgotLS0KCiMjIEV4Y2VsCgojIyBTUFNTCgojIyBjc3YKCgotLS0KCiMgVmVyaXlpIGfDtnLDvG50w7xsZW1lCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+U3ByZWFkc2hlZXQgdXNlcnMgdXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT46ICB3aGVyZSYjMzk7cyB0aGUgZGF0YT88YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiB1c2VycyB1c2luZyBzcHJlYWRzaGVldHM6ICB3aGVyZSYjMzk7cyB0aGUgY29kZT88L3A+Jm1kYXNoOyBMZW9uYXJkIEtpZWZlciAoQGxlbmtpZWZlcikgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9sZW5raWVmZXIvc3RhdHVzLzEwMTU1ODc0NzU1ODA5NTY2NzI/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSA3LCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCgoKYGBge3IsIHJlc3VsdHM9Im1hcmt1cCJ9CiMgbGlicmFyeShueWNmbGlnaHRzMTMpCiMgc3VtbWFyeShmbGlnaHRzKQpgYGAKCgoKYGBgClZpZXcoZGF0YSkKYGBgCgoKYGBgCmRhdGEKYGBgCgoKYGBgCmhlYWQKYGBgCgoKYGBgCnRhaWwKYGBgCgoKYGBgCmdsaW1wc2UKYGBgCgoKYGBgCnN0cgpgYGAKCgpgYGAKc2tpbXI6OnNraW0oKQpgYGAKCi0tLQoKCiMgVmVyaXlpIGRlxJ9pxZ90aXJtZQoKIyMgVmVyaXlpIGtvZCBpbGUgZGXEn2nFn3RpcmVsaW0KCiMjIFZlcml5aSBla2xlbnRpbGVybGUgZGXEn2nFn3Rpcm1lCgohW10oZmlndXJlcy9jaGFuZ2VfZGF0YS5wbmcpCgoKLS0tCgoKIyMgUlN0dWRpbyBhcmFjxLFsxLHEn8SxeWxhIHJlY29kZQoKKnF1ZXN0aW9uciogcGFrZXRpIGt1bGxhbsSxbGFjYWsKCiFbXShmaWd1cmVzL2xldmVsX3JlY29kZS5wbmcpCgoKLS0tCgoKCmh0dHBzOi8vanViYS5naXRodWIuaW8vcXVlc3Rpb25yL2FydGljbGVzL3JlY29kaW5nX2FkZGlucy5odG1sCgoKIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qdWJhL3F1ZXN0aW9uci9tYXN0ZXIvcmVzb3VyY2VzL3NjcmVlbnNob3RzL2lyZWNfMS5wbmcpCgoKLS0tCgohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2p1YmEvcXVlc3Rpb25yL21hc3Rlci9yZXNvdXJjZXMvc2NyZWVuc2hvdHMvaXJlY18yLnBuZykKCgotLS0KCiFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vanViYS9xdWVzdGlvbnIvbWFzdGVyL3Jlc291cmNlcy9zY3JlZW5zaG90cy9pcmVjXzMucG5nKQoKCi0tLQoKIyBCYXNpdCB0YW7EsW1sYXnEsWPEsSBpc3RhdGlzdGlrbGVyCgpgYGAKc3VtbWFyeSgpCmBgYAoKYGBgCm1lYW4KYGBgCgpgYGAKbWVkaWFuCmBgYAoKYGBgCm1pbgpgYGAKCmBgYAptYXgKYGBgCgpgYGAKc2QKYGBgCgpgYGAKdGFibGUoKQpgYGAKCgpgYGB7ciBkZXNjcmlwdGl2ZSwgZWNobz1UUlVFLCBpbmNsdWRlID0gVFJVRX0KbGlicmFyeShyZWFkcikKaXJpc2RhdGEgPC0gcmVhZF9jc3YoImRhdGEvaXJpcy5jc3YiKQoKam12OjpkZXNjcmlwdGl2ZXMoCiAgICBkYXRhID0gaXJpc2RhdGEsCiAgICB2YXJzID0gIlNlcGFsLkxlbmd0aCIsCiAgICBzcGxpdEJ5ID0gIlNwZWNpZXMiLAogICAgZnJlcSA9IFRSVUUsCiAgICBoaXN0ID0gVFJVRSwKICAgIGRlbnMgPSBUUlVFLAogICAgYmFyID0gVFJVRSwKICAgIGJveCA9IFRSVUUsCiAgICB2aW9saW4gPSBUUlVFLAogICAgZG90ID0gVFJVRSwKICAgIG1vZGUgPSBUUlVFLAogICAgc3VtID0gVFJVRSwKICAgIHNkID0gVFJVRSwKICAgIHZhcmlhbmNlID0gVFJVRSwKICAgIHJhbmdlID0gVFJVRSwKICAgIHNlID0gVFJVRSwKICAgIHNrZXcgPSBUUlVFLAogICAga3VydCA9IFRSVUUsCiAgICBxdWFydCA9IFRSVUUsCiAgICBwY0VxR3IgPSBUUlVFKQpgYGAKCi0tLQoKYGBge3Igc2NhdHRlciwgZWNobz1UUlVFLCBpbmNsdWRlPVRSVUV9CiMgaW5zdGFsbC5wYWNrYWdlcygic2NhdHIiKQoKc2NhdHI6OnNjYXQoCiAgICBkYXRhID0gaXJpc2RhdGEsCiAgICB4ID0gIlNlcGFsLkxlbmd0aCIsCiAgICB5ID0gIlNlcGFsLldpZHRoIiwKICAgIGdyb3VwID0gIlNwZWNpZXMiLAogICAgbWFyZyA9ICJkZW5zIiwKICAgIGxpbmUgPSAibGluZWFyIiwKICAgIHNlID0gVFJVRSkKCmBgYAoKIyMgc3VtbWFyeXRvb2xzCgpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvc3VtbWFyeXRvb2xzL3ZpZ25ldHRlcy9JbnRyb2R1Y3Rpb24uaHRtbAoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KbGlicmFyeShzdW1tYXJ5dG9vbHMpCnN1bW1hcnl0b29sczo6ZnJlcShpcmlzJFNwZWNpZXMsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kc3VtbWFyeXRvb2xzOjpmcmVxKGlyaXMkU3BlY2llcywgcmVwb3J0Lm5hcyA9IEZBTFNFLCBzdHlsZSA9ICJybWFya2Rvd24iLCBvbWl0LmhlYWRpbmdzID0gVFJVRSkKYGBgCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aXRoKHRvYmFjY28sIHByaW50KGN0YWJsZShzbW9rZXIsIGRpc2Vhc2VkKSwgbWV0aG9kID0gJ3JlbmRlcicpKQpgYGAKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aXRoKHRvYmFjY28sIAogICAgIHByaW50KGN0YWJsZShzbW9rZXIsIGRpc2Vhc2VkLCBwcm9wID0gJ24nLCB0b3RhbHMgPSBGQUxTRSksIAogICAgICAgICAgIG9taXQuaGVhZGluZ3MgPSBUUlVFLCBtZXRob2QgPSAicmVuZGVyIikpCmBgYAoKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpzdW1tYXJ5dG9vbHM6OmRlc2NyKGlyaXMsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpkZXNjcihpcmlzLCBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSwgdHJhbnNwb3NlID0gVFJVRSwgCiAgICAgIG9taXQuaGVhZGluZ3MgPSBUUlVFLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KIyB2aWV3KGRmU3VtbWFyeShpcmlzKSkKCmBgYAoKCiFbXShmaWd1cmVzL2Rmc3VtbWFyeS5wbmcpCgoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmRmU3VtbWFyeSh0b2JhY2NvLCBwbGFpbi5hc2NpaSA9IEZBTFNFLCBzdHlsZSA9ICJncmlkIikKYGBgCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KCiMgRmlyc3Qgc2F2ZSB0aGUgcmVzdWx0cwoKaXJpc19zdGF0c19ieV9zcGVjaWVzIDwtIGJ5KGRhdGEgPSBpcmlzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElDRVMgPSBpcmlzJFNwZWNpZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gZGVzY3IsIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZSA9IFRSVUUpCgojIFRoZW4gdXNlIHZpZXcoKSwgbGlrZSBzbzoKCnZpZXcoaXJpc19zdGF0c19ieV9zcGVjaWVzLCBtZXRob2QgPSAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQojIHZpZXcoaXJpc19zdGF0c19ieV9zcGVjaWVzKQpgYGAKCiFbXShmaWd1cmVzL0Rlc2NyaXB0aXZlU3RhdGlzdGljcy5wbmcpCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmRhdGEodG9iYWNjbykgIyB0b2JhY2NvIGlzIGFuIGV4YW1wbGUgZGF0YWZyYW1lIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlCkJNSV9ieV9hZ2UgPC0gd2l0aCh0b2JhY2NvLCAKICAgICAgICAgICAgICAgICAgIGJ5KEJNSSwgYWdlLmdyLCBkZXNjciwgCiAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSkpCnZpZXcoQk1JX2J5X2FnZSwgInBhbmRlciIsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpCTUlfYnlfYWdlIDwtIHdpdGgodG9iYWNjbywgCiAgICAgICAgICAgICAgICAgICBieShCTUksIGFnZS5nciwgZGVzY3IsICB0cmFuc3Bvc2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IikpKQoKdmlldyhCTUlfYnlfYWdlLCAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIiwgb21pdC5oZWFkaW5ncyA9IFRSVUUpCmBgYAoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp0b2JhY2NvX3N1YnNldCA8LSB0b2JhY2NvWyAsYygiZ2VuZGVyIiwgImFnZS5nciIsICJzbW9rZXIiKV0KZnJlcV90YWJsZXMgPC0gbGFwcGx5KHRvYmFjY29fc3Vic2V0LCBmcmVxKQoKIyB2aWV3KGZyZXFfdGFibGVzLCBmb290bm90ZSA9IE5BLCBmaWxlID0gJ2ZyZXEtdGFibGVzLmh0bWwnKQpgYGAKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kd2hhdC5pcyhpcmlzKQpgYGAKCi0tLQoKYGBge3J9CmZyZXEodG9iYWNjbyRnZW5kZXIsIHN0eWxlID0gJ3JtYXJrZG93bicpCmBgYAoKLS0tCgpgYGB7cn0KcHJpbnQoZnJlcSh0b2JhY2NvJGdlbmRlciksIG1ldGhvZCA9ICdyZW5kZXInKQpgYGAKCi0tLQoKIyMgc2tpbXIKCmBgYApsaWJyYXJ5KHNraW1yKQpza2ltKGRmKQpgYGAKCi0tLQoKIyMgRGF0YUV4cGxvcmVyCgpgYGAKbGlicmFyeShEYXRhRXhwbG9yZXIpCkRhdGFFeHBsb3Jlcjo6Y3JlYXRlX3JlcG9ydChkZikKYGBgCgoKWyFbXShodHRwczovL3N0YXRpYzEuc3F1YXJlc3BhY2UuY29tL3N0YXRpYy81OGVlZjg4NDZhNDk2M2U0Mjk2ODdhNGQvdC81YmRmYzJmYjRkN2E5YzA0ZWU1MGI3YWEvMTU0MTM5MTE2MDcwMi9kYXRhRXhwbG9yZXJHaWZMZy5naWY/Zm9ybWF0PTE1MDB3KV0oaHR0cHM6Ly93d3cubGl0dGxlbWlzc2RhdGEuY29tL2Jsb2cvc2ltcGxlLWVkYSkKCgoKLS0tCgojIyBHcmFmaWtsZXIKCmBgYHtyfQojIGxpYnJhcnkoZ2dwbG90MikKIyBsaWJyYXJ5KG1vc2FpYykKIyBtUGxvdChpcmlzZGF0YSkKYGBgCgotLS0KCmBgYHtyfQpjdGFibGUodG9iYWNjbyRnZW5kZXIsIHRvYmFjY28kc21va2VyLCBzdHlsZSA9ICdybWFya2Rvd24nKQpgYGAKCi0tLQoKYGBge3J9CnByaW50KGN0YWJsZSh0b2JhY2NvJGdlbmRlciwgdG9iYWNjbyRzbW9rZXIpLCBtZXRob2QgPSAncmVuZGVyJykKYGBgCgpgYGAKZGVzY3IodG9iYWNjbywgc3R5bGUgPSAncm1hcmtkb3duJykKCnByaW50KGRlc2NyKHRvYmFjY28pLCBtZXRob2QgPSAncmVuZGVyJywgdGFibGUuY2xhc3NlcyA9ICdzdC1zbWFsbCcpCgpkZlN1bW1hcnkodG9iYWNjbywgc3R5bGUgPSAnZ3JpZCcsIHBsYWluLmFzY2lpID0gRkFMU0UpCgpwcmludChkZlN1bW1hcnkodG9iYWNjbywgZ3JhcGgubWFnbmlmID0gMC43NSksIG1ldGhvZCA9ICdyZW5kZXInKQpgYGAKCgotLS0KCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SGVyZSwgYnVpbGRpbmcgdXAgYSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvZ2dwbG90Mj9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2dncGxvdDI8L2E+IGFzIHNsb3dseSBhcyBwb3NzaWJsZSwgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT4uICBJbmNyZW1lbnRhbCBhZGp1c3RtZW50cy4gIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHN0ZWFjaGluZ2lkZWFzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzdGVhY2hpbmdpZGVhczwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90LmNvL25VdWxRbDhiUGgiPnBpYy50d2l0dGVyLmNvbS9uVXVsUWw4YlBoPC9hPjwvcD4mbWRhc2g7IEdpbmEgUmV5bm9sZHMgKEBFdmFNYWVSZXkpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vRXZhTWFlUmV5L3N0YXR1cy8xMDI5MTA0NjU2NzYzNTcyMjI2P3JlZl9zcmM9dHdzcmMlNUV0ZnciPkF1Z3VzdCAxMywgMjAxODwvYT48L2Jsb2NrcXVvdGU+PHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoKCi0tLQoKClshW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RyZWFtUnMvZXNxdWlzc2UvbWFzdGVyL21hbi9maWd1cmVzL2VzcXVpc3NlLmdpZildKGh0dHBzOi8vZ2l0aHViLmNvbS9kcmVhbVJzL2VzcXVpc3NlKQoKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkRyZWFtaW5nIG9mIGEgZmFuY3kgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL1JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I1JzdGF0czwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2dncGxvdD9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2dncGxvdDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2RhdGF2aXo/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNkYXRhdml6PC9hPiBidXQgc3RpbGwgc2NhcmVkIG9mIHR5cGluZyA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvY29kZT9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2NvZGU8L2E+PyA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL19wdmljdG9ycj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AX3B2aWN0b3JyPC9hPiBlc3F1aXNzZSBwYWNrYWdlIGhhcyB5b3UgY292ZXJlZCA8YSBocmVmPSJodHRwczovL3QuY28vMXZJRFhjVkFBRiI+aHR0cHM6Ly90LmNvLzF2SURYY1ZBQUY8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9SbFRrcHRuck52Ij5waWMudHdpdHRlci5jb20vUmxUa3B0bnJOdjwvYT48L3A+Jm1kYXNoOyBSYWRvc2xhdyBQYW5jemFrIChAUlBhbmN6YWspIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vUlBhbmN6YWsvc3RhdHVzLzEwNDcwMTk1ODg2NTgwNDA4MzI/cmVmX3NyYz10d3NyYyU1RXRmdyI+T2N0b2JlciAyLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoKCgoKCgoKCgoKLS0tCgojIFJjbWRyCgpgYGAKbGlicmFyeShSY21kcikKClJjbWRyOjpDb21tYW5kZXIoKQoKYGBgCgoKLSBBIENvbXBhcmF0aXZlIFJldmlldyBvZiB0aGUgUiBDb21tYW5kZXIgR1VJIGZvciBSCgpodHRwOi8vcjRzdGF0cy5jb20vYXJ0aWNsZXMvc29mdHdhcmUtcmV2aWV3cy9yLWNvbW1hbmRlci8KCgotLS0KCiMgamFtb3ZpCgpodHRwczovL3d3dy5qYW1vdmkub3JnLwoKIVshW10oaHR0cHM6Ly93d3cuamFtb3ZpLm9yZy9hc3NldHMvbWFpbi1zY3JlZW5zaG90LnBuZyldKGh0dHBzOi8vd3d3LmphbW92aS5vcmcvKQoKCmh0dHBzOi8vYmxvZy5qYW1vdmkub3JnLzIwMTgvMDcvMzAvcmouaHRtbAoKIVshW10oaHR0cHM6Ly9ibG9nLmphbW92aS5vcmcvYXNzZXRzL2ltYWdlcy9yai5wbmcpXShodHRwczovL2Jsb2cuamFtb3ZpLm9yZy8yMDE4LzA3LzMwL3JqLmh0bWwpCgotLS0KCiMgU29ucmFraSBLb251bGFyCgotIFJTdHVkaW8gaWxlIEdpdEh1YgotIEhpcG90ZXogdGVzdGxlcmkKLSBSIE1hcmtkb3duIHZlIFIgTm90ZWJvb2sgaWxlIHRla3JhcmxhbmFiaWxpciByYXBvcgoKCi0tLQoKIyBEacSfZXIga29kbGFyCgotIERpxJ9lciBrb2RsYXIgacOnaW4gYmFrxLFuxLF6OiBbaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvL10oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykKCgotLS0KCiMgR2VyaSBCaWxkaXJpbQoKLSBHZXJpIGJpbGRpcmltIGnDp2luIHTEsWtsYXnEsW7EsXo6IF9bR2VyaSBiaWxkaXJpbSBmb3JtdV0oaHR0cHM6Ly9nb28uZ2wvZm9ybXMvWWpHWjVESGd0UGxSMVJuQjMpXwoKCi0tLQoKPHNjcmlwdCBpZD0iZHNxLWNvdW50LXNjciIgc3JjPSIvL2h0dHBzLXNiYWxjaS1naXRodWItaW8uZGlzcXVzLmNvbS9jb3VudC5qcyIgYXN5bmM+PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJkaXNxdXNfdGhyZWFkIj48L2Rpdj4KPHNjcmlwdD4KCi8qKgoqICBSRUNPTU1FTkRFRCBDT05GSUdVUkFUSU9OIFZBUklBQkxFUzogRURJVCBBTkQgVU5DT01NRU5UIFRIRSBTRUNUSU9OIEJFTE9XIFRPIElOU0VSVCBEWU5BTUlDIFZBTFVFUyBGUk9NIFlPVVIgUExBVEZPUk0gT1IgQ01TLgoqICBMRUFSTiBXSFkgREVGSU5JTkcgVEhFU0UgVkFSSUFCTEVTIElTIElNUE9SVEFOVDogaHR0cHM6Ly9kaXNxdXMuY29tL2FkbWluL3VuaXZlcnNhbGNvZGUvI2NvbmZpZ3VyYXRpb24tdmFyaWFibGVzKi8KLyoKdmFyIGRpc3F1c19jb25maWcgPSBmdW5jdGlvbiAoKSB7CnRoaXMucGFnZS51cmwgPSBQQUdFX1VSTDsgIC8vIFJlcGxhY2UgUEFHRV9VUkwgd2l0aCB5b3VyIHBhZ2UncyBjYW5vbmljYWwgVVJMIHZhcmlhYmxlCnRoaXMucGFnZS5pZGVudGlmaWVyID0gUEFHRV9JREVOVElGSUVSOyAvLyBSZXBsYWNlIFBBR0VfSURFTlRJRklFUiB3aXRoIHlvdXIgcGFnZSdzIHVuaXF1ZSBpZGVudGlmaWVyIHZhcmlhYmxlCn07CiovCihmdW5jdGlvbigpIHsgLy8gRE9OJ1QgRURJVCBCRUxPVyBUSElTIExJTkUKdmFyIGQgPSBkb2N1bWVudCwgcyA9IGQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CnMuc3JjID0gJ2h0dHBzOi8vaHR0cHMtc2JhbGNpLWdpdGh1Yi1pby5kaXNxdXMuY29tL2VtYmVkLmpzJzsKcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGltZXN0YW1wJywgK25ldyBEYXRlKCkpOwooZC5oZWFkIHx8IGQuYm9keSkuYXBwZW5kQ2hpbGQocyk7Cn0pKCk7Cjwvc2NyaXB0Pgo8bm9zY3JpcHQ+UGxlYXNlIGVuYWJsZSBKYXZhU2NyaXB0IHRvIHZpZXcgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZGlzcXVzLmNvbS8/cmVmX25vc2NyaXB0Ij5jb21tZW50cyBwb3dlcmVkIGJ5IERpc3F1cy48L2E+PC9ub3NjcmlwdD4KCi0tLQoKCgoKCg==